// 码农果果蔬  小程序
const express = require('express')
const apiRouter = express.Router()
const fs = require('fs')
const writeData = require('../../db/module/writeData')
const readData = require('../../db/module/readData')
const delData = require('../../db/module/delData')
const jwt = require('jsonwebtoken')
const { disposeDatabase } = require('../../models/relevanceDatabase')
const { default: axios } = require('axios')
const secretKey = 'Aa2317770710' //生成token的密钥
const crypto = require('crypto')
const decryptData = require('../../models/decryptData')

// 小程序登录解析 code 获取 openid
apiRouter.post('/getSessionKey', async (req, res) => {
  const { code } = req.body
  if (!code) {
    return res.status(400).json({ code: 400, message: '缺少 code 参数' })
  }
  try {
    // 向微信服务器发送请求，换取 session_key 和 openid
    const response = await axios.get('https://api.weixin.qq.com/sns/jscode2session', {
      params: {
        appid: 'wxd13ec5e936e7d88d',
        secret: '54ff12c13dad5e3738bc0afe2d5d9f08',
        js_code: code,
        grant_type: 'authorization_code'
      }
    })
    const { session_key, openid } = response.data
    if (session_key && openid) {
      // 返回 session_key 和 openid 给前端
      res.status(200).json({ code: 20000, session_key, openid })
    } else {
      // 处理微信服务器返回的错误信息
      res.status(200).json({
        code: 50000,
        message: `微信接口调用失败：${response.data.errmsg}`
      })
    }
  } catch (error) {
    console.error('请求微信接口失败', error)
    res.status(200).json({ code: 50000, message: '请求微信接口失败' })
  }
})

// 解密手机号的接口
apiRouter.post('/decrypt_phone_number', async (req, res) => {
  const { encryptedData, iv, sessionKey, openid } = req.body

  // 检查是否缺少必要参数
  if (!encryptedData || !iv || !sessionKey || !openid) {
    return res.send({
      code: 50000,
      msg: '缺少必要参数'
    })
  }

  // 调用解密函数
  const decryptedData = decryptData(encryptedData, sessionKey, iv)

  if (decryptedData) {
    try {
      // 解析解密后的数据
      const decryptedJson = JSON.parse(decryptedData)
      const phoneNumber = decryptedJson.phoneNumber

      // 创建一个容器 用来返回用户信息
      let returnUserInfo = {}

      // 通关手机号 查询用户列表是否存在当前用户，如果存在返回用户信息，如果不存在保存一份默认的用户信息
      let userInfo = await readData({ phoneNumber }, 'userList_brogrammer')

      if (userInfo.data && userInfo.data.length > 0) {
        returnUserInfo = userInfo.data[0]
      } else {
        // 如果不存在，保存一份默认的用户信息
        returnUserInfo = {
          phoneNumber: phoneNumber, //用户手机号
          nickName: '会员用户',
          //账户余额
          balance: 0.0,
          //账户积分
          integral: 0,
          // 优惠卷
          coupon: [],
          // 性别
          gender: '',
          // 用户头像
          avatarUrl: 'https://gd-hbimg.huaban.com/20c519c534c8ea0017e0a3ca3ef17c8bff1cb801361c-LXUegq_fw658webp' // 默认头像链接
        }
        let res = await writeData(returnUserInfo, 'userList_brogrammer')
        returnUserInfo.id = res.id // 将插入的 ID 添加到返回的用户信息中
      }

      return res.send({
        code: 20000,
        msg: '解密成功',
        data: returnUserInfo
      })
    } catch (parseError) {
      console.error('解密数据解析失败:', parseError)
      return res.send({
        code: 50000,
        msg: '解密数据解析失败',
        error: parseError.message
      })
    }
  } else {
    return res.send({
      code: 50000,
      msg: '解密失败'
    })
  }
})

// 商品 加入 购物车
apiRouter.post('/addShoppingCart', async (req, res) => {
  try {
    const params = req.body
    // 查询 购物车 列表 如果当前用户在购物车列表中存在该商品 则更新数量 否则添加一条新的数据
    let shoppingCartList = await readData({ userId: params.userId, commodityId: params.commodityId }, 'shoppingCartList')

    if (shoppingCartList.data && shoppingCartList.data.length > 0) {
      // 如果购物车中已经存在该商品，更新数量
      let existingItem = shoppingCartList.data[0]
      if (params.isCover == true) {

        existingItem.commodityNum = params.commodityNum // 更新数量
      } else {
        existingItem.commodityNum += params.commodityNum // 更新数量
      }
      await writeData(existingItem, 'shoppingCartList') // 更新数据库
    } else {
      // 如果购物车中不存在该商品，添加新的商品
      let newItem = {
        userId: params.userId,
        commodityId: params.commodityId,
        commodityNum: params.commodityNum
      }
      await writeData(newItem, 'shoppingCartList') // 添加到数据库
    }
    res.send({
      code: 20000,
      msg: '添加购物车成功'
    })
  } catch (error) {
    res.send({
      code: 50000,
      msg: error
    })
  }
})

// 查询购物车数据
apiRouter.post('/getShoppingCartList', async (req, res) => {
  try {
    const params = req.body
    let result = await readData(params, 'shoppingCartList')

    for (let i = 0; i < result.data.length; i++) {
      let item = result.data[i]
      let commodityList = await readData({ id: item.commodityId }, 'commodityList')


      // 删除商品的 _id 确保不会和购物车的id混合
      delete commodityList.data[0]._id
      delete commodityList.data[0].id

      Object.assign(item, commodityList.data[0]) // 将商品信息添加到购物车数据中);
    }

    res.send({
      code: 20000,
      msg: '查询购物车成功',
      data: result.data
    })

    // 关联数据字典字典项
    // let database_res = await disposeDatabase(
    //   [{ key: "commodityClassify", dataBaseCode: "classfiy_mngs" }],
    //   result.data
    // );
    // result.data = database_res;
    // res.send(result);
  } catch (error) {
    res.send({
      code: 50000,
      msg: error.message
    })
  }
})

// 删除购物车 数据
apiRouter.post('/deleteShoppingCart', async (req, res) => {
  try {
    let result = await delData(req.body, 'shoppingCartList')
    res.send(result)
  } catch (error) {
    res.send({
      code: 50000,
      msg: error
    })
  }
})

// 保存订单数据
apiRouter.post('/saveOrder', async (req, res) => {
  try {
    const params = req.body
    let result = await writeData(params, 'orderList')
    res.send(result)
  } catch (error) {
    res.send({
      code: 50000,
      msg: error
    })
  }
})

// 获取订单列表
apiRouter.post('/getOrderList', async (req, res) => {
  try {
    const params = req.body
    let result = await readData(params, 'orderList')

    // 根据订单信息 关联商品列表
    for (let i = 0; i < result.data.length; i++) {
      let item = result.data[i]
      item.commodityList = [] // 初始化商品列表
      for (let j = 0; j < item.commodityIdList.length; j++) {
        let commodityId = item.commodityIdList[j]
        // 根据 commidityId 查询商品列表
        let commodityList_result = await readData({ id: commodityId.id }, 'commodityList')


        item.commodityList.push({
          ...commodityList_result.data[0],
          commodityNum: commodityId.number
        }) // 将商品信息添加到订单数据中
      }
    }

    res.send({
      code: 20000,
      msg: '查询订单成功',
      data: result.data
    })
  } catch (error) {
    res.send({
      code: 50000,
      msg: error.message
    })
  }
})

// 保存收货地址
apiRouter.post('/saveAddress', async (req, res) => {
  try {
    const params = req.body
    let result = await writeData(params, 'addressList')
    res.send(result)
  } catch (error) {
    res.send({
      code: 50000,
      msg: error
    })
  }
})

// 获取收货地址
apiRouter.post('/getAddressList', async (req, res) => {
  try {
    const params = req.body
    let result = await readData(params, 'addressList')
    res.send(result)
  } catch (error) {
    res.send({
      code: 50000,
      msg: error.message
    })
  }
})

module.exports = apiRouter
